#ifndef KNOWLEDGEBASE_H
#define KNOWLEDGEBASE_H

#include <QObject>
#include <QList>
#include <QMap>
#include "rule.h"

/**
 * @brief 知识库类，用于管理和存储规则
 * 
 * 该类负责规则的初始化、分类、选择和查询等功能，
 * 是专家系统中的核心组件之一
 */
class KnowledgeBase : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象，默认为nullptr
     */
    explicit KnowledgeBase(QObject *parent = nullptr);
    
    /**
     * @brief 获取所有动物规则
     * @return 包含所有动物规则的列表
     */
    QList<Rule> getAnimalRules() const;
    
    /**
     * @brief 初始化规则库
     * 
     * 清空现有规则，准备从外部文件加载新规则
     */
    void initializeRules();
    
    /**
     * @brief 获取所有规则类别
     * @return 包含所有规则类别的字符串列表
     */
    QStringList getRuleCategories() const;
    
    /**
     * @brief 根据类别获取规则
     * @param category 规则类别名称
     * @return 属于指定类别的规则列表
     */
    QList<Rule> getRulesByCategory(const QString &category) const;
    
    /**
     * @brief 选择指定类别的规则
     * @param selectedCategories 要选择的规则类别列表
     */
    void selectRules(const QStringList &selectedCategories);
    
    /**
     * @brief 获取已选择的规则
     * @return 已选择的规则列表
     */
    QList<Rule> getSelectedRules() const;
    
    /**
     * @brief 添加自定义规则
     * @param rule 要添加的规则
     * @param category 规则所属类别，默认为"自定义规则"
     */
    void addCustomRule(const Rule &rule, const QString &category = "自定义规则");

private:
    QList<Rule> m_rules;                  ///< 存储所有规则的列表
    QMap<QString, QList<Rule>> m_ruleCategories;  ///< 按类别存储规则的映射
    QStringList m_selectedCategories;      ///< 已选择的规则类别列表
};

#endif // KNOWLEDGEBASE_H